đŠ 5.2B â firebase_datastore_setup
Objectif đŻâ
Apprendre à structurer et gérer des données avec Firestore (la base de données NoSQL orientée documents de Firebase).
Ă faire đ ïžâ
PrĂ©requisâ
Avoir complété la configuration Firebase de base avec firebase_core et google_sign_in.
Ătape 14 - Tester l'accĂšs Ă Firestore (optionnel)â
Pour vérifier que tout fonctionne correctement:
- Allez Ă la console Firebase
- Créez une base de données Firestore en mode test
- Dans votre
main.dart, remplacez la fonction_incrementCounter()avec:
void _incrementCounter() {
final db = FirebaseFirestore.instance;
final user = <String, dynamic>{
"first": "Ada",
"last": "Lovelace",
"born": 1815
};
db.collection("users").add(user).then((DocumentReference doc) =>
print('DocumentSnapshot added with ID: ${doc.id}')
);
setState(() {
_counter++;
});
}
- Lancez l'application
- Appuyez sur le bouton +
- Allez Ă la console Firebase dans le volet Firestore
- Vous devriez voir les données apparaßtre!
COMMIT et PUSH.
Ătape 1 - Installation de cloud_firestoreâ
flutter pub add cloud_firestore
flutterfire configure
Faites un COMMIT PUSH.
Ătape 2 - CrĂ©ation d'une base de donnĂ©es Firestoreâ
- Allez dans la console Firebase
- Sélectionnez votre projet
- Dans le panneau Ă gauche, cliquez sur Firestore Database
- Cliquez sur Créer une base de données
- Sélectionnez le mode test (permet de lire/écrire sans rÚgles de sécurité)
- Choisissez votre région (par défaut c'est fine)
- Cliquez sur Créer
Ătape 3 - Comprendre la structure Firestoreâ
Firestore est orienté documents, pas relationnel comme SQL:
- Collections: Conteneurs de documents (comme des tables)
- Documents: Objets JSON avec un ID unique
- Subcollections: Collections imbriquées dans un document
- Champs: Propriétés des documents
Exemple de structure:
users/
âââ user1 (document)
â âââ name: "Alice"
â âââ email: "alice@example.com"
â âââ posts/ (subcollection)
â âââ post1
â âââ post2
âââ user2 (document)
Ătape 4 - CrĂ©er une collection manuellementâ
Dans la console Firestore:
- Cliquez sur + Créer une collection
- Nommez-la
users - Cliquez sur Suivant
- Cliquez sur Ajouter un document et remplissez manuellement:
- ID:
user1(personnalisé) - Champs:
name(string): "Alice"email(string): "alice@example.com"age(number): 25
- ID:
Ajoutez quelques documents Ă votre collection pour tester.
Ătape 5 - AccĂ©der aux donnĂ©es en Flutterâ
Dans un StatefulWidget, créez une méthode pour récupérer les données:
Future<List<Map<String, dynamic>>> getUsers() async {
final db = FirebaseFirestore.instance;
final snapshot = await db.collection('users').get();
return snapshot.docs.map((doc) => doc.data()).toList();
}
Dans la UI, utilisez un FutureBuilder pour afficher les données:
FutureBuilder<List<Map<String, dynamic>>>(
future: getUsers(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Erreur: ${snapshot.error}');
}
if (!snapshot.hasData) {
return Text('Chargement...');
}
final users = snapshot.data!;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(users[index]['name']),
subtitle: Text(users[index]['email']),
);
},
);
},
)
Testez l'affichage de vos données.
Faites un COMMIT PUSH.
Ătape 6 - Ajouter des donnĂ©es en Flutterâ
Créez une méthode pour ajouter un nouvel utilisateur:
Future<void> addUser(String name, String email, int age) async {
final db = FirebaseFirestore.instance;
await db.collection('users').add({
'name': name,
'email': email,
'age': age,
});
}
Utilisez add() pour générer un ID automatiquement, ou set() si vous avez un ID spécifique:
await db.collection('users').doc('user123').set({
'name': 'Bob',
'email': 'bob@example.com',
});
Ajoutez un bouton pour insérer des données et vérifiez dans la console Firebase.
Faites un COMMIT PUSH.
Ătape 7 - Utiliser StreamBuilder pour les mises Ă jour en temps rĂ©elâ
Au lieu de récupérer les données une seule fois, utilisez snapshots() pour écouter les changements:
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Erreur: ${snapshot.error}');
}
if (!snapshot.hasData) {
return Text('Chargement...');
}
final users = snapshot.data!.docs;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
final user = users[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(user['name']),
subtitle: Text(user['email']),
);
},
);
},
)
Testez en ajoutant des documents dans la console Firebase â ils apparaĂźtront en temps rĂ©el!
Ătape 8 - Mettre Ă jour et supprimerâ
Pour mettre Ă jour un document:
await db.collection('users').doc('user1').update({
'age': 26,
});
Pour supprimer un document:
await db.collection('users').doc('user1').delete();
Ajoutez des boutons pour tester ces opérations.
Faites un COMMIT PUSH.
Ătape 9 - Filtrer et trier les donnĂ©esâ
Vous pouvez filtrer les résultats avec where():
final query = db
.collection('users')
.where('age', isGreaterThan: 18)
.orderBy('age', descending: true);
final snapshot = await query.get();
Testez diffĂ©rentes requĂȘtes pour comprendre le fonctionnement.
Points clĂ©s Ă retenirâ
- â Firestore est NoSQL et orientĂ© documents
- â Les collections sont flexibles (pas de schĂ©ma rigide)
- â
Utilisez
StreamBuilderpour les mises Ă jour en temps rĂ©el - â Chaque requĂȘte Ă Firestore coĂ»te des "lectures" (attention aux quotas gratuits!)
- â Structurez vos donnĂ©es intelligemment (denormalization vs sous-collections)